iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

在應用中主要分享曾經走過的坑和對於一些比較常用的圖表屬性說明

環境:vite + vue3 <script setup> + js
套件版本: am4

#應用

- 😰 坑 - html container 'chartdiv' not foun

按照官網文件用 npm 安裝後,開始使用過程中也是按照文件的 Basics 執行,相關程式碼如下:
https://ithelp.ithome.com.tw/upload/images/20230926/20158099dohVghOkCh.png

<template>
  <div id="chartdiv" style="width: 100%; height: 400px" />
</template>

<script setup>
import * as am4core from '@amcharts/amcharts4/core'
import * as am4charts from '@amcharts/amcharts4/charts'
import am4themes_animated from '@amcharts/amcharts4/themes/animated'

// 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
am4core.useTheme(am4themes_animated)

// Create chart instance
let chart = am4core.create('chartdiv', am4charts.PieChart)

// Add data
chart.data = [...]

let pieSeries = chart.series.push(new am4charts.PieSeries())
pieSeries.dataFields.value = 'litres'
pieSeries.dataFields.category = 'country'
</script>

畫面展示:
https://ithelp.ithome.com.tw/upload/images/20230926/20158099QfZErMxZgx.png

畫面沒有出現任何圖表卻出現這段提醒:html container 'chartdiv' not found

解決辦法:

  1. 繼續看完文件,發現有一個是 amchart4 的整合,其中一個是搭配 vue.js
  2. 有沒有發現?在一般的 HTML 基礎使用是以 id 來控制,但是如果和 vue.js 使用則是改用 ref (這樣也有關係?我滿頭問號!)/images/emoticon/emoticon19.gif
  3. 說真的我還是不相信,所以叫出 DEMO 然後全部複製貼上,因為 DEMO 也是用 id 去抓的,只是多做一件事情:把實例掛載到 onMounted
    import { onMounted, onBeforeUnmount } from 'vue'
    import * as am4core from '@amcharts/amcharts4/core'
    import * as am4charts from '@amcharts/amcharts4/charts'
    import am4themes_animated from '@amcharts/amcharts4/themes/animated'
    
    // 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
    am4core.useTheme(am4themes_animated)
    
    function renderPieChart() {
      // Create chart instance
      const chart = am4core.create('chartdiv', am4charts.PieChart)
    
      // Add data
      chart.pieChart.data = [...]
    
      // Create pie series
      let pieSeries = chart.pieChart.series.push(new am4charts.PieSeries())
      pieSeries.dataFields.value = 'litres'
      pieSeries.dataFields.category = 'country'
    }
    
    onMounted(() => {
      renderPieChart()
    })
    
    onBeforeUnmount(() => {
      if (chart) {
        chart.dispose()
      }
    })
    

    畫面展示:
    https://ithelp.ithome.com.tw/upload/images/20230926/20158099G3IFVGdM1T.png
    ⚠️ 對於 AmCharts 4(或其他類似的圖表庫),圖表的渲染需要依賴特定的 DOM 元素,因此必須在 DOM 元素可用後才能進行。 這就是為什麼通常將 AmCharts 圖表的創建和配置放在 onMounted 生命週期鉤子內的原因。
    https://ithelp.ithome.com.tw/upload/images/20230926/20158099UEv59WAkPu.png

*- pie chart 屬性說明 *

Anatomy of a Pie Chart
https://www.amcharts.com/docs/v4/chart-types/pie-chart/

1. Y 軸

屬性 說明 範例
valueAxis 物件 圖表的 Y 軸 const valueAxis = new AmCharts.ValueAxis();
axisColor 軸的顏色 valueAxis.axisColor= “#FF6600”;
axisThickness 軸的寬度 valueAxis.axisThickness = 1;
gridAlpha 軸的透明度,數值介於0-1之間,0全透明 valueAxis1.gridAlpha = 0.2;
tickLength 軸從下到上像左或右伸出來的延長線 valueAxis1.tickLength =0;
minimum 軸的最小值,如果不設定那麼最小值根據資料動態變化 valueAxis1.minimum = -100;
maximum 軸的最大值,如果不設定那麼最大值會根據資料動態變化 valueAxis1.maximum = 100;
  1. 圖例 legend

** 官網說明**
https://www.amcharts.com/docs/v4/concepts/legend/

語法 說明
chart.legend = new am4charts.Legend(); 建立了一個新的圖例實例並將其指派給 chart.legend 屬性
chart.legend.position = ‘bottom’; 可用選項有: "left", "right", "top", "bottom" (default) 和 "absolute"
chart.legend.useDefaultMarker = true; 啟用了圖例中使用預設的標記符號(marker)
chart.legend.itemContainers.template.paddingTop = 5; Controlling spacing:圖例中每個項目容器的頂部內邊距
chart.legend.itemContainers.template.paddingBottom = 0 Controlling spacing:圖例中每個項目容器的底部內邊距
chart.legend.markers.template.children.getIndex(0); 取得圖例的第一個標記符號
marker.width = 12; 設定圖例標記符號的寬度為 12 像素
marker.height = 12; 設定圖例標記符號的高度為 12 像素
marker.dy = 4; 垂直偏移量為 4 像素。 這可以用來微調標記符號的位置
marker.cornerRadius(6, 6, 6, 6); 設定標記符號的圓角半徑
  1. 資料系列 Series
語法-data 說明
chart.series.push(new am4charts.PieSeries()); 建立一個新的餅圖資料系列
pieSeries.dataFields.value 指定圓餅圖資料系列中表示值的資料欄位。
pieSeries.dataFields.category 指定圓餅圖資料系列中表示類別(標籤)的資料欄位。
語法-樣式標籤 說明
pieSeries.slices.template.stroke 配置圓餅圖切片的邊框顏色
pieSeries.slices.template.strokeOpacity 設定切片的邊框不透明度
pieSeries.ticks.template.disabled 圓餅圖切片上的不顯示刻度線
pieSeries.labels.template.disabled 圓餅圖切片上的不顯示標籤
語法-tooltip 說明
pieSeries.slices.template.tooltipText = "[bold]{category}\n{value.value} 次[/]"; 當滑鼠懸停在圓餅圖切片上時顯示的工具提示文字,這裡可以用 { } 客製化內容
pieSeries.tooltip.getFillFromObject 設定工具提示的填滿色彩不會從物件中獲取,而將其自訂設定。
pieSeries.tooltip.label.propertyFields.fill 設定工具提示文字的填滿顏色為白色。
pieSeries.tooltip.background.propertyFields.stroke 工具提示的背景邊框顏色為白色
pieSeries.tooltip.background.propertyFields.fill = "color"; 設定工具提示的背景填滿顏色為資料中的 "color" 屬性

- bar chart

DEMO
https://www.amcharts.com/demos/
https://ithelp.ithome.com.tw/upload/images/20230926/20158099rFqj0wFhwG.png

DEMO 有很多範例簡介,點選後可以再圖表的右下角看到原始碼,這裡要特別留意...因為目前已經是 am5 所以如果專案是使用舊版本要自行轉換
<template>
  <div class="hello" id="chartdiv" />
</template>

<script setup>
import { onMounted, onBeforeUnmount } from 'vue';
import * as am4core from '@amcharts/amcharts4/core';
import * as am4charts from '@amcharts/amcharts4/charts';
import am4themes_animated from '@amcharts/amcharts4/themes/animated';

// 呼叫 AmCharts的useTheme 方法,用於啟用 AmCharts 的主題(這裡是am4themes_animated)
am4core.useTheme(am4themes_animated);

let chart = null;

function renderXYChart() {
  // Create chart instance
  const chart = am4core.create('chartdiv', am4charts.XYChart)

  // Add data
  chart.data = [
    {
      date: new Date(2018, 0, 1),
      value: 450,
      value2: 362,
      value3: 699
    },...
  ];

  // Create axes
  const dateAxis = chart.xAxes.push(new am4charts.DateAxis());
  dateAxis.renderer.grid.template.location = 0;
  dateAxis.renderer.minGridDistance = 30;

  const valueAxis = chart.yAxes.push(new am4charts.ValueAxis());

  // 監聽Y軸的ready事件,該事件在Y軸準備好後觸發。
  valueAxis.events.on('ready', function (ev) {
    ev.target.min = ev.target.min
    ev.target.max = ev.target.max
  });

  // Create series
  function createSeries(field, name) {
    const series = chart.series.push(new am4charts.ColumnSeries())
    series.dataFields.valueY = field
    series.dataFields.dateX = 'date'
    series.name = name
    series.tooltipText = '{dateX}: [b]{valueY}[/]'
    series.strokeWidth = 2

    return series
  };

  createSeries('value', 'Series #1');
  createSeries('value2', 'Series #2');
  createSeries('value3', 'Series #3');

  // 建立圖例(Legend)並將其賦值給圖表,以在圖表中顯示系列標籤
  chart.legend = new am4charts.Legend();

  // 啟用互動式遊標,允許使用者在圖表上查看數據點的詳細資訊
  chart.cursor = new am4charts.XYCursor();

  // 新增水平滾動條,以便用戶可以滾動查看較長的圖表
  chart.scrollbarX = new am4core.Scrollbar();
}

onMounted(() => {
  renderXYChart()
})

onBeforeUnmount(() => {
  if (chart) {
    chart.dispose()
  }
})
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
  width: 100%;
  height: 500px;
}
</style>

上一篇
數據探索者 - amcharts.js (上)
下一篇
可視化圖表 - ECharts.js (上)
系列文
Vue 元素美麗的轉變:前端小萌新勇闖套件的魔法陣30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言